home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / machine / konami.c < prev    next >
C/C++ Source or Header  |  2000-01-01  |  1KB  |  67 lines

  1. /***************************************************************************
  2.  
  3.   The Konami_1 CPU is a 6809 with opcodes scrambled. Here is how to
  4.   descramble them.
  5.  
  6. ***************************************************************************/
  7.  
  8. #include "driver.h"
  9.  
  10.  
  11.  
  12. unsigned char decodebyte( unsigned char opcode, unsigned short address )
  13. {
  14. /*
  15. >
  16. > CPU_D7 = (EPROM_D7 & ~ADDRESS_1) | (~EPROM_D7 & ADDRESS_1)  >
  17. > CPU_D6 = EPROM_D6
  18. >
  19. > CPU_D5 = (EPROM_D5 & ADDRESS_1) | (~EPROM_D5 & ~ADDRESS_1) >
  20. > CPU_D4 = EPROM_D4
  21. >
  22. > CPU_D3 = (EPROM_D3 & ~ADDRESS_3) | (~EPROM_D3 & ADDRESS_3) >
  23. > CPU_D2 = EPROM_D2
  24. >
  25. > CPU_D1 = (EPROM_D1 & ADDRESS_3) | (~EPROM_D1 & ~ADDRESS_3) >
  26. > CPU_D0 = EPROM_D0
  27. >
  28. */
  29.     unsigned char xormask;
  30.  
  31.  
  32.     xormask = 0;
  33.     if (address & 0x02) xormask |= 0x80;
  34.     else xormask |= 0x20;
  35.     if (address & 0x08) xormask |= 0x08;
  36.     else xormask |= 0x02;
  37.  
  38.     return opcode ^ xormask;
  39. }
  40.  
  41.  
  42.  
  43. static void decode(int cpu)
  44. {
  45.     unsigned char *rom = memory_region(REGION_CPU1+cpu);
  46.     int diff = memory_region_length(REGION_CPU1+cpu) / 2;
  47.     int A;
  48.  
  49.  
  50.     memory_set_opcode_base(cpu,rom+diff);
  51.  
  52.     for (A = 0;A < diff;A++)
  53.     {
  54.         rom[A+diff] = decodebyte(rom[A],A);
  55.     }
  56. }
  57.  
  58. void konami1_decode(void)
  59. {
  60.     decode(0);
  61. }
  62.  
  63. void konami1_decode_cpu4(void)
  64. {
  65.     decode(3);
  66. }
  67.